現代C++(C++11/14/17)は ゼロコスト抽象化 低レベルなハードウェア制御と高レベルな可読性の間のギャップを埋めます。効率性は決定論的なメモリ管理によって得られ、表現力はコンパイル時論理によって強化されます。
1. メモリレイアウト:std::array と std::vector
std::array は、Cスタイル配列の現代的なラッパーであり、 スタック上 に割り当てられ、サイズはコンパイル時に既知です。一方、 std::vector は ヒープ上 に存在し、動的に拡張されます。一方、 std::vector は幾何学的成長係数(通常 $1.5\times$ または $2\times$)を使用しますが、現代のC++では shrink_to_fit() 未使用容量を回収する機能を提供しており、ゴルーグのようなマネージド言語よりもより厳密な制御が可能です。
2. SFINAE と型安全性
通過して std::enable_if および std::is_enumにより、開発者は 置換失敗はエラーではない(SFINAE)を実装できます。これにより、コンパイラは型特性に基づいて特定の関数オーバーロードを選択でき、例えばその std::underlying_typeを使って列挙型用の汎用ストリーム演算子を作成することが可能になります。
// C++11 メモリ管理のハイライト
v.push_back(std::move(obj)); // ムーブセマンティクス
arr.at(0); // 境界チェック
v.push_back(std::move(obj)); // ムーブセマンティクス
arr.at(0); // 境界チェック
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>